PostgreSQL vacuum工作原理
1 惰性冻结
1.1 发生条件
freezeLimit_txid=(OldestXmin−vacuum_freeze_min_age)
1.2 冻结的流程
2 急性冻结
2.1 发生条件
pg_database.datfrozenxid<(OldestXmin−vacuum_freeze_table_age)
2.2 冻结流程
2.2.1 9.6之前的冻结
2.2.2 9.6之后的冻结
在完成清理过程之前,必要时会更新pg_database.datfrozenxid。每个pg_database.datfrozenxid列都包含相应数据库中的最小pg_class.relfrozenxid。如果在迫切模式下仅仅对表1做冻结处理,则不会更新该数据库的pg_database.datfrozenxid,因为其他关系的pg_class.relfrozenxid(当前数据库可见的其他表和系统视图)还没有发生变化,如图6.5(1)所示。如果当前数据库中的所有关系都以迫切模式冻结,则数据库的pg_database.datfrozenxid 就会被更新,因为此数据库的所有关系的 pg_class.relfrozenxid 都被更新为当前的freezeLimit txid,如图6.5(2)所示。
3 冻结信息查询
3.1 数据库
SELECT datname, datfrozenxidFROM pg_databaseWHERE datname= 'testdb';
3.2 表
SELECT n.nspname as "Schema", c.relname as "Name", c.relfrozenxid
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid= c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname <> 'information_schema' AND n.nspname!~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY c.relfrozenxid::text::bigint DESC;